#include "test_manager.h"

#include <string>
#include <iostream>

using namespace std;

/*! \mainpage FAP - Frequency Assignment Problem
 *
 * \section intro Uvod do problemu
 * Problem prirazovani frekvenci (FAP) je jednim z novodobych problemu bezdratovych siti.
 * Zadanim je sada anten v prostoru a pocty vysilacu na jednotlivych antenach. Cilem programu
 * je priradit kazdemu vysilaci frekvenci, na ktere muze vysilat, tak, aby se vysledna vysilani
 * nerusila (neinterferovala). Dve vysilani se rusi prave tehdy kdyz jsou si jejich zdrojove
 * vysilace dostatecne geograficky blizke a frekvence techto vysilani jsou si taktez blizke. 
 * Cilem je vyuzit co nejuzsi frekvencni pasmo (rozdil mezi nejvetsi a nejmensi pouzitou frekvenci),
 * protoze se za nej musi platit nadnarodnim telekomunikacnim uradum.
 * 
 * Problem hledani prirazeni frekvenci s optimalni (nejmensi) sirkou pasma je NP-tezky, resi se tedy
 * ruznymi heuristickymi algoritmy.      
 * \section about_sec O Programu
 * Program FAP implementuje 5 ruznych heuristickych algoritmu na vypocet reseni vyse uvedeneho problemu.
 * Dale umoznuje nacitat jeho zadani (popsane uzivatelem v XML souboru) a srovnavat vysledky dosazene
 * jednotlivymi algoritmy. Implementovan je sekvencni algoritmus, algoritmus simulovaneho zihani,
 * tabu search algoritmus a dva geneticke algoritmy. 
 * \section main_sec Hlavni tridy programu
 * Nejzakladnejsi tridou programu je TestManager, ktera rozdeluje vsechnu praci. Nacita zadani a nastaveni
 * vsech "testu", vytvari zadane algoritmy a spousti je na zadanych problemech, sbira jejich vysledky a
 * zapisuje je do prislusnych vystupnich souboru.
 * 
 * Tridy zdedene z Options nacitaji nastaveni ze vstupniho souboru a predavaji je dalsim komponentam
 * programu.
 * 
 * Tridy zdedene z Area (Philadelphia a Coordinates) implementuji mapy anten (zadani problemu) a 
 * slouzi k uchovavani aktualniho reseni.        
 * 
 * Tridy zdedene z Algorithm (SequentialAlgorithm, AnnealingAlgorithm, TabuAlgorithm, GeneticAlgorithm
 * a PermutationAlgorithm) jsou implementacemi vyse zminenych algoritmu. Po vytvoreni dostanou vzdy zadani
 * problemu (tridu zdedenou z Area) a pote pokyn k vypoctu reseni.  
 */


int main(int argc, char * argv[]) {
	if (argc < 2) {
		std::cout << "CHYBA: Jako parametr zadejte jmeno testovaciho souboru!" << std::endl;
		return 1;
	}
	if (argc > 2) {
		std::cout << "Varovani: Program pouziva jen jeden parametr - jmeno testovaciho souboru!";
	}
	TestManager fap(argv[1]);
	fap.SolveTests();
	fap.PrintResults();
/*	string name, surname;
	Timer t;
	cout << "Zadejte jmeno: ";
	cin >> name;
	cout << "Cas: " << t.lap << endl << "Zadejte prijmeni: ";
	cin >> surname;
	cout << "Cas: " << t.stop << endl << name << " " << surname << endl << "Celkem: ";
	cout << t.total();
	getchar();
	getchar();
*/
	return 0;
}

